home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 431_01 / rclient.c < prev    next >
Text File  |  1995-01-06  |  27KB  |  1,056 lines

  1. /*
  2.   this program will have two simple functions.
  3.     CLIENT
  4.       1. check IFS request. if not for my drives, pass on
  5.       2. packet the request for xfer
  6.       3. xfer packet. wait for return
  7.       4. unpacket the result
  8.       5. return
  9. */
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <ctype.h>
  14. #include <dir.h>
  15. #include <dos.h>
  16.  
  17. #include "ifs.h"
  18. #include "comio.h"
  19. #include "crc32.h"
  20. #include "svr0.h"
  21. #include "ifs0.h"
  22. #include "rifs.h"
  23. #include "myalloc.h"
  24. #include "rclient.h"
  25.  
  26. #include "local.h"
  27. unsigned _stklen=512;
  28.  
  29. LOCAL BYTE    *SDA;         /* swappable data area         */
  30. LOCAL WORD     SDA_maxsize; /* size of SDA                 */
  31. LOCAL WORD     SDA_minsize;
  32. LOCAL BYTE    *CDS_base;    /* current directory structure */
  33. LOCAL WORD     CDS_size;    /* # of bytes per entry        */
  34. LOCAL WORD     CDS_ct;      /* number of entries           */
  35.  
  36. /*************************************************************************
  37.  *************************************************************************
  38.   CLIENT
  39.  *************************************************************************
  40.  *************************************************************************/
  41. /*
  42.   these are the sda members about which i am concerned
  43.   (set on entry)
  44. */
  45. LOCAL WORD  *SDA_CURR_PSP;
  46. LOCAL DTA  **SDA_CURR_DTA;
  47. LOCAL char  *SDA_FN1;
  48. LOCAL char  *SDA_FN2;
  49. LOCAL SDB   *SDA_SDB;
  50. LOCAL CDS   *SDA_CURR_CDS;
  51. LOCAL DIR   *SDA_DIR_ENTRY;
  52. LOCAL BYTE  *SDA_SRCH_ATTR;
  53. LOCAL BYTE  *SDA_OPEN_MODE;
  54. LOCAL CDS  **SDA_DRIVE_CDSPTR;
  55. LOCAL SFT  **SDA_SFT;
  56. LOCAL WORD  *SDA_EXTOPEN_ACTION;
  57. LOCAL WORD  *SDA_EXTOPEN_ATTR;
  58. LOCAL WORD  *SDA_EXTOPEN_MODE;
  59.  
  60. LOCAL CDS     *CDS_init;          /* initial CDS structure       */
  61. LOCAL XMITBUF *iobuf1,            /* current / last used buffers */
  62.               *iobuf2,
  63.               *iobufptr;          /* current buffer        */
  64. LOCAL WORD     iobufptr_datasize; /* i/o data buffer size  */
  65. LOCAL WORD     iobufptr_rwdatasize; /* largest block to send for read/write
  66.                                        must be no bigger than datasize-8  */
  67. LOCAL BYTE     remote;            /* remote drive map      */
  68. LOCAL BYTE     local;             /* local drive           */
  69.  
  70. /*
  71.   drive translation table
  72.   0 = not mapped, else 'A'..'Z' is translation
  73.   ex:
  74.     SVR_XLAT_TABLE[3] == 'C'
  75.       then local drive D is mapped to server drive C
  76. */
  77. LOCAL BYTE DRIVE_XLAT_TABLE[26];
  78.  
  79. LOCAL IFS_STAT IFS_stat;
  80.  
  81.  
  82. LOCAL BYTE portmapped[3];
  83.  
  84. BOOL portio(INTREGS *regs);
  85.  
  86. int Intr17(INTREGS *regs)
  87. {
  88.   if ((regs->dx < 3) && (regs->ax < 0x300) && portmapped[regs->dx]) {
  89.     WORD oldport = regs->dx;
  90.     regs->dx=portmapped[regs->dx]-1;
  91.     portio(regs);
  92.     regs->dx=oldport;
  93. /*
  94.     if (regs->ax)
  95.       regs->flags |= 0x40;
  96.     else
  97.       regs->flags &= ~0x40;
  98. */
  99.     return 1;
  100.   } else
  101.     return 0;
  102. }
  103.  
  104. LOCAL void uninit(void)
  105. {
  106.   ifs0_shutdown();
  107.   CommIO_shutdown();
  108.   if (CDS_init) {
  109.     memcpy(CDS_base, CDS_init, CDS_size * CDS_ct);
  110.     my_free(CDS_init);
  111.     CDS_init=0;
  112.   }
  113.   if (iobuf1) {
  114.     my_free(iobuf1);
  115.     my_free(iobuf2);
  116.     iobufptr=0;
  117.     iobufptr_datasize=0;
  118.   }
  119. }
  120.  
  121. /*
  122.   initialize misc-> varaibles
  123. */
  124. LOCAL BOOL InitClient(int intno)
  125. {
  126.   struct REGPACK regs;
  127.   BYTE *LOL; /* list of lists       */
  128.  
  129.   regs.r_ax=0x5d06;
  130.   intr(0x21, ®s);
  131.   SDA=MK_FP(regs.r_ds, regs.r_si);
  132.   SDA_maxsize=regs.r_cx;
  133.   SDA_minsize=regs.r_dx;
  134.  
  135.   /*
  136.     init lcl_SDA (for SERVER)
  137.   */
  138.   regs.r_ax=0x5200;
  139.   intr(0x21, ®s);
  140.   LOL=MK_FP(regs.r_es, regs.r_bx);
  141.  
  142.   CDS_base=*(void **) (LOL+0x16);
  143.   CDS_ct=*(BYTE *) (LOL + 0x21);
  144.  
  145.   if (_osmajor >= 5) {
  146.     CDS_size           = 0x58;
  147.     SDA_CURR_DTA       = (void *) (SDA + 0x000c);
  148.     SDA_CURR_PSP       = (void *) (SDA + 0x0010);
  149.     SDA_FN1            = (void *) (SDA + 0x009e);
  150.     SDA_FN2            = (void *) (SDA + 0x011e);
  151.     SDA_SDB            = (void *) (SDA + 0x019e);
  152.     SDA_DIR_ENTRY      = (void *) (SDA + 0x01b3);
  153.     SDA_CURR_CDS       = (void *) (SDA + 0x01d3);
  154.     SDA_SRCH_ATTR      = (void *) (SDA + 0x024d);
  155.     SDA_OPEN_MODE      = (void *) (SDA + 0x024e);
  156.     SDA_SFT            = (void *) (SDA + 0x027e);
  157.     SDA_DRIVE_CDSPTR   = (void *) (SDA + 0x0282);
  158.     SDA_EXTOPEN_ACTION = (void *) (SDA + 0x02dd);
  159.     SDA_EXTOPEN_ATTR   = (void *) (SDA + 0x02df);
  160.     SDA_EXTOPEN_MODE   = (void *) (SDA + 0x02e1);
  161.   } else {
  162.     CDS_size           = 0x51;
  163.     SDA_CURR_DTA       = (void *) (SDA + 0x000c);
  164.     SDA_CURR_PSP       = (void *) (SDA + 0x0010);
  165.     SDA_FN1            = (void *) (SDA + 0x0092);
  166.     SDA_FN2            = (void *) (SDA + 0x0112);
  167.     SDA_SDB            = (void *) (SDA + 0x0192);
  168.     SDA_DIR_ENTRY      = (void *) (SDA + 0x01a7);
  169.     SDA_CURR_CDS       = (void *) (SDA + 0x01c7);
  170.     SDA_SRCH_ATTR      = (void *) (SDA + 0x023a);
  171.     SDA_OPEN_MODE      = (void *) (SDA + 0x023b);
  172.     SDA_SFT            = (void *) (SDA + 0x0268);
  173.     SDA_DRIVE_CDSPTR   = (void *) (SDA + 0x026c);
  174.     SDA_EXTOPEN_ACTION = 0; /* these do not exist in DOS 3.x */
  175.     SDA_EXTOPEN_ATTR   = 0;
  176.     SDA_EXTOPEN_MODE   = 0;
  177.   }
  178.   ifs0_init(intno);
  179.  
  180.   CDS_init=my_malloc(CDS_size * CDS_ct);
  181.   memcpy(CDS_init, CDS_base, CDS_size * CDS_ct);
  182.  
  183.   iobufptr_datasize=BLOCKSIZE;
  184.   iobufptr_rwdatasize=BLOCKSIZE-8;
  185.   iobuf1=my_malloc(iobufptr_datasize+sizeof(*iobuf1));
  186.   iobuf2=my_malloc(iobufptr_datasize+sizeof(*iobuf2));
  187.   iobufptr=iobuf1;
  188.  
  189.   return 1;
  190. }
  191.  
  192. #define COMMAND(a) {iobufptr->length=0; iobufptr->cmd=a; }
  193. #define SPARAM(a) {strcpy(iobufptr->data+iobufptr->length, a); iobufptr->length+=strlen(a)+1; }
  194.  
  195. WORD Transmit(void);
  196.  
  197. /*
  198.   port i/o
  199.     dx = port # (0..2, 0x80..0x83)
  200.     ah = function #
  201.     al = character
  202. */
  203. LOCAL BOOL portio(INTREGS *regs)
  204. {
  205.   COMMAND(IFS_PORTOUT);
  206.   *(WORD *) iobufptr->data = regs->dx;
  207.   *(WORD *) (iobufptr->data+2) = regs->ax;
  208.   iobufptr->length = 4;
  209.   Transmit();
  210.   regs->ax=iobufptr->cmd;
  211.   return (regs->ax) ? 0xff00 : 0x0000;
  212. }
  213. /*
  214.   remove directory
  215. */
  216. LOCAL BOOL ifs_rmdir(INTREGS *regs)
  217. {
  218.   COMMAND(IFS_RMDIR);
  219.   SPARAM(SDA_FN1);
  220.   iobufptr->data[0]=remote;
  221.   Transmit();
  222.   regs->ax=iobufptr->cmd;
  223.   return (regs->ax) ? 0xff00 : 0x0000;
  224. }
  225.  
  226. /*
  227.   change directory
  228. */
  229. LOCAL BOOL ifs_chdir(INTREGS *regs)
  230. {
  231.   COMMAND(IFS_CHDIR);
  232.   SPARAM(SDA_FN1);
  233.   iobufptr->data[0]=remote;
  234.   Transmit();
  235.   regs->ax=iobufptr->cmd;
  236.   return (regs->ax) ? 0xff00 : 0x0000;
  237. }
  238.  
  239. /*
  240.   create directory
  241. */
  242. LOCAL BOOL ifs_mkdir(INTREGS *regs)
  243. {
  244.   COMMAND(IFS_MKDIR);
  245.   SPARAM(SDA_FN1);
  246.   iobufptr->data[0]=remote;
  247.   Transmit();
  248.   regs->ax=iobufptr->cmd;
  249.   return (regs->ax) ? 0xff00 : 0x0000;
  250. }
  251.  
  252. LOCAL BOOL ifs_closefile(INTREGS *regs)
  253. {
  254.   SFT *sft=MK_FP(regs->es, regs->di);
  255.  
  256.   COMMAND(IFS_CLOSEFILE);
  257.   *(int *) iobufptr->data=sft->dir_sector;
  258.   *(unsigned *) (iobufptr->data+2) = sft->ftime;
  259.   *(unsigned *) (iobufptr->data+4) = sft->fdate;
  260.   iobufptr->length=6;
  261.   Transmit();
  262.  
  263.   if (sft->handlect > 0)
  264.     sft->handlect--;
  265.  
  266.   regs->ax=iobufptr->cmd;
  267.   return (regs->ax) ? 0xff00 : 0x0000;
  268. }
  269.  
  270. LOCAL BOOL ifs_commitfile(INTREGS *regs)
  271. {
  272.   COMMAND(IFS_COMMITFILE);
  273.   Transmit();
  274.   regs->ax=iobufptr->cmd;
  275.   return (regs->ax) ? 0xff00 : 0x0000;
  276. }
  277.  
  278. #define NORMALIZE(a) a=MK_FP(FP_SEG(a)+(FP_OFF(a) >> 4), FP_OFF(a) & 0x0f)
  279.  
  280. LOCAL BOOL ifs_readfile(INTREGS *regs)
  281. {
  282.   SFT *sft=MK_FP(regs->es, regs->di);
  283.   char *dst=(char *) *SDA_CURR_DTA;
  284.   WORD  sz=regs->cx;
  285.   int   read;
  286.  
  287.   regs->cx=0;
  288.   while (sz > 0) {
  289.     int tz=min(iobufptr_rwdatasize, sz);
  290.  
  291.     COMMAND(IFS_READFILE);
  292.     *(int  *) iobufptr->data    =sft->dir_sector;
  293.     *(long *) (iobufptr->data+2)=sft->fpos;
  294.     *(int  *) (iobufptr->data+6)=tz;
  295.     iobufptr->length=8;
  296.  
  297.     Transmit();
  298.  
  299.     read=*(int *) iobufptr->data;
  300.     memcpy(dst, iobufptr->data+2, read);
  301.  
  302.     dst += read;
  303.     NORMALIZE(dst);
  304.  
  305.     sz -= read;
  306.     regs->cx += read;
  307.  
  308.     regs->ax=iobufptr->cmd;
  309.  
  310.     sft->fpos += read;
  311.  
  312.     if ((regs->ax != 0) || (read != tz))
  313.       break;
  314.   }
  315.   return (regs->ax) ? 0xff00 : 0x0000;
  316. }
  317.  
  318. LO